package org.niux.aims.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.niux.aims.dao.IApplicationDAO;
import org.niux.aims.dao.IEntityTypeDAO;
import org.niux.aims.dao.IEntitysDAO;
import org.niux.aims.models.Application;
import org.niux.aims.models.EntityType;
import org.niux.aims.models.Entitys;
import org.niux.aims.service.IEntitysService;
import org.niux.aims.vo.ApplicationVO;
import org.niux.aims.vo.EntityTypeVO;
import org.niux.aims.vo.EntityVO;
import org.springframework.stereotype.Service;

/**
 * 
 * Copyright (c) 2009,niux<br>
 * All rights reserved.<br>
 * 
 * 文件名称：EntitysService.java<br>
 * 摘    要：实体数据操作服务类<br>
 * <br>
 * 当前版本：<br>
 * 作    者：铭显 Email: <a href="mailto:liangmingxian@gmail.com">liangmingxian@gmail.com</a><br>
 * 完成日期：@since 2013-8-1<br>
 * <br>
 * 取代版本：<br>
 * 原作者  ：<br>
 * 完成日期：@since Oct 22, 2009<br>
 */
@Service(value="entityService")
public class EntitysService implements IEntitysService {

	@Resource(name="entityDao")
	private IEntitysDAO entityDAO;
	
	@Resource(name="applicationDao")
	private IApplicationDAO applicationDao;
	
	@Resource(name="entityTypeDao")
	private IEntityTypeDAO entityTypeDao;
	
	/**
	 * 
	 * 方法概述：获取所有实体数据
	 * 描述：获取所有实体数据
	 * @return
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-8-1
	 */
	public List<Entitys> findAll() {
		return entityDAO.findAll();
	}

	/**
	 * 
	 * 方法概述：分页获取实体数据
	 * 描述：分页获取实体数据
	 * @param startPage
	 * @param pageSize
	 * @return
	 * 返回类型：List<Entitys>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-6
	 */
	public List<Entitys> findByPage(int startPage, int pageSize){
		return entityDAO.findByPage(startPage,pageSize);
	}
	
	/**
	 * 
	 * 方法概述：新增实体
	 * 描述：新增实体
	 * @param entityVo
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-8-18
	 */
	public void save(EntityVO entityVo){
		Application application = applicationDao.findById(Integer.parseInt(entityVo.getApp()));
		
		EntityType entityType = entityTypeDao.findById(Integer.parseInt(entityVo.getEntityType()));
		
		Entitys entity = new Entitys();
		entity.setApplication(application);
		entity.setEntityName(entityVo.getEntityName());
		entity.setEntityType(entityType);
		entity.setEntityCode(entityVo.getEntityCode());
		
		if(entityVo.getParent() != null){
			Entitys parent = entityDAO.findById(Integer.parseInt(entityVo.getParent()));
			entity.setEntitys(parent);
		}
		
		entityDAO.save(entity);
	}
	
	/**
	 * 
	 * 方法概述：修改实体
	 * 描述：修改实体
	 * @param entityVo
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-8-20
	 */
	public void update(EntityVO entityVo){
		Application application = new Application();
		application.setId(Integer.parseInt(entityVo.getApp()));
		
		EntityType entityType = new EntityType();
		entityType.setId(Integer.parseInt(entityVo.getEntityType()));
		
		
		Entitys entity = new Entitys();
		entity.setId(Integer.parseInt(entityVo.getId()));
		entity.setApplication(application);
		entity.setEntityName(entityVo.getEntityName());
		entity.setEntityType(entityType);
		entity.setEntityCode(entityVo.getEntityCode());
		
		if(entityVo.getParent() != null){
			Entitys parent = new Entitys();
			parent.setId(Integer.parseInt(entityVo.getParent()));
			entity.setEntitys(parent);
		}
		
		entityDAO.update(entity);
	}
	
	/**
	 * 
	 * 方法概述：删除实体
	 * 描述：删除实体
	 * @param id
	 * 返回类型：void
	 * 修改人：梁铭显
	 * 修改时间：2013-8-20
	 */
	public void del(int id){
		Entitys entity = new Entitys();
		entity.setId(id);
		entityDAO.delete(entity);
	}
	
	/**
	 * 
	 * 方法概述：根据ID获取实体
	 * 描述：根据ID获取实体
	 * @param id
	 * @return
	 * 返回类型：Entitys
	 * 修改人：梁铭显
	 * 修改时间：2013-8-19
	 */
	public Entitys findById(int id){
		return entityDAO.findById(id);
	}
	
	/**
	 * 
	 * 方法概述：根据父实体获取实体数据
	 * 描述：根据父实体获取实体数据
	 * @param entity
	 * @return
	 * 返回类型：List<Entitys>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-24
	 */
	public List<Entitys> findByParent(Integer id){
		if(id == null){
			return entityDAO.findByParent(null);
		} else {
			Entitys entity = new Entitys();
			entity.setId(id);
			return entityDAO.findByParent(entity);
		}
	}
	
	/**
	 * 
	 * 方法概述：根据实体名称获取实体数据
	 * 描述：根据实体名称获取实体数据
	 * @param name
	 * @return
	 * 返回类型：List<Entitys>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-25
	 */
	public List<Entitys> findByEntityName(String name){
		return entityDAO.findByEntityName(name);
	}
	
	/**
	 * 
	 * 方法概述：根据应用获取实体数据
	 * 描述：根据应用获取实体数据
	 * @param appid
	 * @return
	 * 返回类型：List<EntityVO>
	 * 修改人：梁铭显
	 * 修改时间：2013-9-4
	 */
	public List<EntityVO> findByApp(int appid){
		List<Entitys> entitys = entityDAO.findByApp(appid);
		List<EntityVO> entityVos = new ArrayList<EntityVO>();
		
		//MENU实体
		for (Entitys entity : entitys) {
			if(entity.getEntitys() == null){
				EntityVO menu = transformToVo(entity);
				entityVos.add(menu);
			}
		}
		
		//PAGE实体
		for(EntityVO menu : entityVos){
			List<EntityVO> pages = new ArrayList<EntityVO>();
					
			for (Entitys entity : entitys) {
				if(entity.getEntitys() != null && entity.getEntitys().getId() == Integer.parseInt(menu.getId())){
					EntityVO page = transformToVo(entity);
					pages.add(page);
				}
			}
			menu.setChild(pages);
		}
		
		//BUTTON实体
		for(EntityVO menu : entityVos){
			if(!menu.getChild().isEmpty()){
				for(EntityVO page : menu.getChild()){
					List<EntityVO> buttons = new ArrayList<EntityVO>();
							
					for (Entitys entity : entitys) {
						if(entity.getEntitys() != null && entity.getEntitys().getId() == Integer.parseInt(page.getId())){
							EntityVO button = transformToVo(entity);
							buttons.add(button);
						}
					}
							
					page.setChild(buttons);
				}
			}
		}
		
		return entityVos;
	}
	
	/**
	 * 
	 * 方法概述：DO转换成VO
	 * 描述：DO转换成VO
	 * @param entity
	 * @return
	 * 返回类型：EntityVO
	 * 修改人：梁铭显
	 * 修改时间：2013-8-25
	 */
	public EntityVO transformToVo(Entitys entity){
		EntityVO entityVo = new EntityVO();
		entityVo.setId(Integer.toString(entity.getId()));
		entityVo.setEntityName(entity.getEntityName());
		entityVo.setEntityCode(entity.getEntityCode());
		
		ApplicationVO appVo = new ApplicationVO();
		appVo.setId(entity.getApplication().getId());
		appVo.setAppName(entity.getApplication().getAppName());
		
		entityVo.setAppVo(appVo);
		
		EntityTypeVO entityTypeVo = new EntityTypeVO();
		entityTypeVo.setId(entity.getEntityType().getId());
		entityTypeVo.setEntityTypeName(entity.getEntityType().getEntityType());
		
		entityVo.setEntityTypeVo(entityTypeVo);
		
		return entityVo;
	}
}
